package com.powernode.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.HashSet;

/**
 * swagger自动装配类
 * 每个业务模块都包含很多API接口，业务模块需要生成对应的API接口文档，
 * 而业务模块生成的API接口文档只是内容不一样，
 * 因此，API接口文档的描述信息需要在各个业务模块的配置文件中进行配置，
 * 这样，读取API接口文档的描述信息的功能就统一存放到公共业务模块里。
 */
@Configuration
@EnableConfigurationProperties(SwaggerProperties.class)
public class SwaggerAutoConfiguration {

    @Autowired
    private SwaggerProperties swaggerProperties;

    /**
     * 项目环境对象
     */
    @Autowired
    private Environment environment;

    /**
     * 设置swagger文档对象
     * 1.swagger文档只有在开发阶段生成，生产环境不需要生成文档
     *
     * @return
     */
    @Bean
    public Docket docket() {
        // 生成文档的开关，true默认开启状态
        Boolean flag = true;
        // 从项目环境对象中获取项目运行环境标识
        String[] activeProfiles = environment.getActiveProfiles();
        // 循环遍历
        for (String activeProfile : activeProfiles) {
            if (activeProfile.equals("pro")) {
                // pro一般表示生产环境
                flag = false;
                break;
            }
        }
        // 返回配置好的Docket对象
        return new Docket(DocumentationType.OAS_30).apiInfo(getApiInfo())  // 文档描述信息对象
                .enable(flag)   // 是否生成文档的开关
                .select().apis(RequestHandlerSelectors.basePackage(swaggerProperties.getBasePackage())) // 基于包名描述swagger注解
                .build();
    }

    /**
     * 获取API信息
     * <p>
     * 该方法用于构建并返回一个ApiInfo对象，该对象包含了Swagger UI展示的API文档信息
     * 包括标题、描述、版本、服务条款URL、联系人信息、许可证信息等
     *
     * @return 返回API信息对象
     */
    private ApiInfo getApiInfo() {
        // 创建联系人对象，包含Swagger文档中显示的联系人姓名、网址和邮箱
        Contact contact = new Contact(swaggerProperties.getName(),
                swaggerProperties.getUrl(),
                swaggerProperties.getEmail());

        // 构建并返回ApiInfo对象，包含Swagger文档中的各项信息
        ApiInfo apiInfo = new ApiInfo(swaggerProperties.getTitle(),
                swaggerProperties.getDescription(),
                swaggerProperties.getVersion(),
                swaggerProperties.getTermsOfServiceUrl(),
                contact,
                swaggerProperties.getLicense(),
                swaggerProperties.getLicenseUrl(),
                new HashSet<>());
        return apiInfo;
    }

}